package com.zxy.zxyrpc.serializer;

import com.zxy.zxyrpc.spi.SpiLoader;

/**
 * 序列化器工厂
 *
 * @author zxy
 * @since 2025/5/13
 **/
public class SerializerFactory {
    /*
    // 采用硬编码方式，将序列化器存储在 HashMap中（采用spi机制替代）
    public static final Map<String, Serializer> KEY_SERIALIZER_MAP = new HashMap<String, Serializer>() {{
        put(SerializerKeys.JDK, new JdkSerializer());
        put(SerializerKeys.JSON, new JsonSerializer());
        put(SerializerKeys.KRYO, new KryoSerializer());
        put(SerializerKeys.HESSIAN, new HessianSerializer());
        put(SerializerKeys.FST, new FstSerializer());
    }};*/
    /**
     * 私有化构造器，采用懒汉式单例创建
     * */
    private static volatile SerializerFactory serializerFactory;
    private SerializerFactory(){}


    // 初始化所有的 序列化器SPI资源（可以考虑按需加载）
    static {
        SpiLoader.loadAll();
    }

    /**
     * 默认序列化器
     * 补充：javaSPI一个接口，通过引入相同作用的配置，替换默认配置（但我们不同业务可能侧重不同序列化方式）
     *      要求：1.每个SPI接口只加载一种实现类，这个类担负所有需要此功能的业务
     *      缺点：不适合多变的业务
     */
    public static final Serializer DEFAULT_SERIALIZER = SpiLoader.getInstance(Serializer.class, "jdk");

    /**
     * 根据参数获取序列化器实例
     * 扩展：懒汉式创建工厂实例
     */
    public static Serializer getInstance(String key) {
        if (serializerFactory == null){
            synchronized (SerializerFactory.class){
                if (serializerFactory == null)
                    serializerFactory = new SerializerFactory();
            }
        }
        return SpiLoader.getInstance(Serializer.class, key);
    }
}
